#include <stdio.h>

void f1(const int *p)
{
    // 只限制修改p所指向的值，而p本身的地址是可以修改的
    // *p = 0; // compile error
    int num = 1;
    p = &num; // ok
}

void f2(int *const p)
{
    // 只限制局部变量p不能被修改，但是p指向的值可以修改
    *p = 0; // ok
    int num = 1;
    // p = &num; // compile error
}

void f3(const int *const p)
{
    // 同时制修改p所指向的值，也限制修改局部变量p的值
    // *p = 0; // compile error
    int num = 1;
    // p = &num; // compile error
}

int main(void)
{
    int num = 1;
    f1(&num);
    printf("%d\n", num);
    f2(&num);
    printf("%d\n", num);
    f3(&num);
    printf("%d\n", num);
}